/**	@file collisioni.cc
 *	Questo è un file C++ che contiene le definizioni delle funzioni dichiarate in collisioni.h.
 * Queste funzioni vengono chiamate quando è necessario stabilise se due oggetti hanno colliso.
 * Le funzioni specifiche per gli oggetti chiamano a loro volta collisioni_X e collisioni_Y.
 */

#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
#include <iostream>
#include <sstream>
#include "collisioni.h"
#include "globali.h"
#include "models.h"
#include "debug.h"

using namespace std;

/**
 * @return true se x1min e x1max si sovrappongono a x2min e x2max.
 */
bool collisioni_X (int x1min, int x1max, int x2min, int x2max)
{
	D1(cout<<"  collisioni_X"<<endl);
	
	D2(cout<<"x1min: "<<x1min<<"x2min: "<<x2min<<"x1max: "<<x1max<<"x2max: "<<x2max<<endl);
	
	if(x1min < x2min)
			return x1max >= x2min; 
	return x2max >= x1min;
}

/**
 * @return true se y1 e y2 sono affiancate.
 */
bool collisioni_Y(int y1max, int y2min)
{
	D1(cout<<"  collisioni_Y"<<endl);
	
	D2(cout<<"y1max: "<<y1max<<"y2min: "<<y2min<<endl);
	
	if(y1max > y2min)
		return true;
	return false;
}


void gestisci_collisione_bolle(Bolle bolle[], int bDim, Robot robot[], int cDim, Frutta frutta[], int fDim, Drago &drago)
{
	D1(cout<<"  gestisci collisioni bolle"<<endl);

	D1(cout<<" dimensione array bolle = "<<bDim<<endl);
	D1(cout<<" dimensione array frutta = "<<fDim<<endl);
	D1(cout<<" dimensione array robot = "<<cDim<<endl);
	
	for(int i = 0; i < bDim; i++)
	{
		if(bolle[i].vivo)
		{
			for(int j =0; j < cDim; j++)
			{
				D2(cout<<"bolle.ID"<<bolle[i].ID<<"  bolle.x"<<bolle[i].x<<"  bolle.y"<<bolle[i].y);
				D2(cout<<" bolle.velocita:"<<bolle[i].velocita<<" bolle.raggio:"<<bolle[i].raggio<<endl);
	
				if(robot[j].vivo)
				{
					D2(cout<<"robot["<<i<<"].ID"<<robot[i].ID<<"  robot["<<i<<"].x"<<robot[i].x<<"  robot["<<i<<"].y"<<robot[i].y);
					D2(cout<<" robot["<<i<<"].velocita:"<<robot[i].velocita<<" robot["<<i<<"].boundx:"<<robot[i].boundx<<" robot["<<i<<"].boundy:"<< robot[i].boundy);
					D2(cout<<" robot["<<i<<"].maxFrame:"<<robot[i].maxFrame<<" robot["<<i<<"].frameAttuale:"<<robot[i].frameAttuale);
					D2(cout<<" robot["<<i<<"].frameCount: "<<robot[i].frameCount<<" robot["<<i<<"].frameRit"<<robot[i].frameRit<<endl);
					
					if(	collisioni_X(robot[j].x, robot[j].x + robot[j].boundx, bolle[i].x - bolle[i].raggio, bolle[i].x + bolle[i].raggio) && 
						collisioni_Y(robot[j].y + robot[j].boundy,  bolle[i].y - bolle[i].raggio))
						{
							bolle[i].vivo = false;
							robot[j].vivo = false;
	
							drago.punti+=100;
						}				
				}
			}
			
			for(int j =0; j < fDim; j++)
			{
				if(frutta[j].vivo)
				{								
					D2(cout<<"frutta["<<i<<"].ID"<<frutta[i].ID<<"  frutta["<<i<<"].x"<<frutta[i].x<<"  frutta["<<i<<"].y"<<frutta[i].y);
					D2(cout<<" frutta["<<i<<"].velocita:"<<frutta[i].velocita<<" frutta["<<i<<"].boundx:"<<frutta[i].boundx<<" frutta["<<i<<"].boundy:"<< frutta[i].boundy<<endl);
			
					if(	collisioni_X(frutta[j].x, frutta[j].x + frutta[j].boundx, bolle[i].x - bolle[i].raggio, bolle[i].x + bolle[i].raggio) && 
						collisioni_Y(frutta[j].y + frutta[j].boundy,  bolle[i].y - bolle[i].raggio))
						{
							bolle[i].vivo = false;
							frutta[j].vivo = false;

							drago.punti-=100;
							if(drago.punti < 0)
								drago.vite = false;
						}				
				}
			}
		}
	}
}


void gestisci_collisioni_frutta(Frutta frutta[], int fDim, Drago &drago)
{
	D1(cout<<"  gestisci collisioni frutta"<<endl);

	D1(cout<<" dimensione array frutta = "<<fDim<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);
	
	for(int i = 0; i < fDim; i++)
	{
		if(frutta[i].vivo)
		{
			D2(cout<<"frutta["<<i<<"].ID"<<frutta[i].ID<<"  frutta["<<i<<"].x"<<frutta[i].x<<"  frutta["<<i<<"].y"<<frutta[i].y);
			D2(cout<<" frutta["<<i<<"].velocita:"<<frutta[i].velocita<<" frutta["<<i<<"].boundx:"<<frutta[i].boundx<<" frutta["<<i<<"].boundy:"<< frutta[i].boundy<<endl);
			
			if(	collisioni_X(frutta[i].x, frutta[i].x + frutta[i].boundx, drago.x, drago.x + drago.boundx) && 
				collisioni_Y(frutta[i].y + frutta[i].boundy,  drago.y))
			{
				if(prevDir == RIGHT)
				{
					drago.frameAttuale = 10;
					drago.maxFrame = 10;
				}
				else
				{
					drago.frameAttuale = 12;
					drago.maxFrame = 10;
				}
				drago.punti += 100;
				frutta[i].vivo = false;
			}
			else if(robot[i].y >= HEIGHT)
			{
				frutta[i].vivo = false;
			}
		}
	}
}

void gestisci_collisioni_robot(Robot robot[], int cDim, Drago &drago)
{
	D1(cout<<"  gestisci_collisioni_robot"<<endl);

	D1(cout<<" dimensione array robot = "<<cDim<<endl);
	
	D2(cout<<"drago.ID"<<drago.ID<<"  drago.x"<<drago.x<<"  drago.y"<<drago.y<<" drago.vite"<<drago.vite);
	D2(cout<<" drago.velocita:"<<drago.velocita<<" drago.boundx:"<<drago.boundx<<" drago.boundy:"<< drago.boundy);
	D2(cout<<" drago.punti: "<<drago.punti<<" drago.maxFrame:"<<drago.maxFrame<<" drago.frameAttuale:"<<drago.frameAttuale);
	D2(cout<<" drago.frameCount: "<<drago.frameCount<<" drago.frameRit"<<drago.frameRit<<endl);
		
	for(int i = 0; i < cDim; i++)
	{
		if(robot[i].vivo)
		{
			D2(cout<<"robot["<<i<<"].ID"<<robot[i].ID<<"  robot["<<i<<"].x"<<robot[i].x<<"  robot["<<i<<"].y"<<robot[i].y);
			D2(cout<<" robot["<<i<<"].velocita:"<<robot[i].velocita<<" robot["<<i<<"].boundx:"<<robot[i].boundx<<" robot["<<i<<"].boundy:"<< drago.boundy);
			D2(cout<<" robot["<<i<<"].maxFrame:"<<robot[i].maxFrame<<" robot["<<i<<"].frameAttuale:"<<robot[i].frameAttuale);
			D2(cout<<" robot["<<i<<"].frameCount: "<<robot[i].frameCount<<" robot["<<i<<"].frameRit"<<robot[i].frameRit<<endl);
	
			if(	collisioni_X(robot[i].x, robot[i].x + robot[i].boundx, drago.x, drago.x + drago.boundx) && 
				collisioni_Y(robot[i].y + robot[i].boundy,  drago.y))
			{
				drago.vite--;
				robot[i].vivo = false;
			}
			else if(robot[i].y >= HEIGHT)
			{
				robot[i].vivo = false;
				drago.vite--;
			}
		}
	}
}
